/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package orbroker.service.utility;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Responsável por obter e manter as propriedades necessárias ao uso da api de
 * persistência Orbroker, essencialmenta às da classe Broker. A principal forma
 * de uso da classe Broker é através da utilização dos seguintes parâmetos:
 * DataSource: data source Configuration File: xml file Além desses parâmetros
 * podem existir mais arquivos de configuraçao e outras propriedades necessárias
 * a sua manutenção. Desta forma, usaremos a seguinte estratégia: 1-manter um
 * atributo do tipo properties file, o qual aponta para um arquivo de
 * propriedades pré-requisito o perfeito funcionamento dessa api de auxílio ao
 * framework OrBroker; 2-o arquivo suplamencionado deverá ser fornecido pelo
 * usuário da api no seguinte caminho: /META-INF/orbroker.properties
 * 
 * 
 * <p>
 * <a href="OsuPropertiesFile.java.html"><i>View Source</i></a>
 * </p>
 * 
 * @author <a href="mailto:gilberto@gmail.com">Gilberto Caetano de Andrade</a>
 */

class OsuPropertiesFile {
	private transient final Logger log = LoggerFactory.getLogger(getClass());
	private Properties orbrokerPropertiesFile;

	public OsuPropertiesFile() {
		InputStream is = null;
		orbrokerPropertiesFile = new Properties();
		log.debug("Obtendo arquivo de propriedades: {}", "/META-INF/orbroker.properties");
		is = getClass().getResourceAsStream("/META-INF/orbroker.properties");
		if (is == null) {
			throw new ResourceLocatorException("Arquivo de propriedades não encontrado! ");
		}
		try {
			log.debug("Carregando arquivo de propriedades ...");
			orbrokerPropertiesFile.load(is);
			log.debug("Arquivo de propriedades carregado...: {}", orbrokerPropertiesFile);
		} catch (IOException ex) {
			log.debug("ERRO: não foi possível carregar arquivo de propriedades");
			ex.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}

	}

	public String getProperty(final String key) {
		return getOrbrokerPropertiesFile().getProperty(key);
	}

	public Properties getOrbrokerPropertiesFile() {
		return orbrokerPropertiesFile;
	}

	public void getDefaultProperty(ModulePropertiesData mPd) {
		//keys
		mPd.brokerNameKey 	  = "orbroker.brokerName";
		mPd.schemaKey		  = "orbroker.databaseSchema";
		mPd.dbcpDataSourceKey = "orbroker.dbcp.dataSource";
		mPd.dbcpConfigFileKey = "orbroker.dbcp.ConfigFile";
		mPd.logLevelKey 	  = "orbroker.brokerLogLevel";
		//values
		mPd.brokerNameValue 	= getProperty("orbroker.brokerName");
		mPd.schemaValue 		= getProperty("orbroker.databaseSchema");
		mPd.dbcpDataSourceValue = getProperty("orbroker.dbcp.dataSource");
		mPd.dbcpConfigFileValue = getProperty("orbroker.dbcp.ConfigFile");
		mPd.logLevelValue 		= getProperty("orbroker.brokerLogLevel");
	}

	public ModulePropertiesData getModulePropertyValue(final String brokerNameKey) {
		ModulePropertiesData mPd = new ModulePropertiesData();
		String prefix = brokerNameKey.substring(0,brokerNameKey.indexOf('.'));
		//Keys
		mPd.brokerNameKey 		= brokerNameKey;
		mPd.schemaKey 			= prefix + ".orbroker.databaseSchema";
		mPd.dbcpDataSourceKey 	= prefix + ".orbroker.dbcp.dataSource";
		// Loading the values
		mPd.dbcpConfigFileValue = getProperty("orbroker.dbcp.ConfigFile");
		mPd.logLevelValue 		= getProperty("orbroker.brokerLogLevel");
		mPd.brokerNameValue 	= getProperty(mPd.brokerNameKey);
		mPd.schemaValue 		= getProperty(mPd.schemaKey);
		mPd.dbcpDataSourceValue = getProperty(mPd.dbcpDataSourceKey);
		return mPd;
	}

}
